// BSLLS-off

// Этот плагин выполняет переименование переменных если это возможно.
// При возникновении конфликтов регистрирует ошибку, которая указывает на конфликтную переменную.

// Пример ожидаемой структуры параметров (json):
// {"СтароеИмя1": "НовоеИмя1", "СтароеИмя2": "НовоеИмя2"}

Перем Токены;
Перем Типы;
Перем ТаблицаОшибок;
Перем ТаблицаЗамен;
Перем Директивы;

Перем Результат;

Перем МассивМетодов;
Перем ПрефиксПеременныхИПроцедур;
Перем СтруктураПортативныхИнструментов;

Процедура Открыть(Парсер, Параметры) Экспорт
	Типы = Парсер.Типы();
	ТаблицаОшибок = Парсер.ТаблицаОшибок();
	ТаблицаЗамен = Парсер.ТаблицаЗамен();
	Директивы = Парсер.Директивы();
	Токены = Парсер.Токены();
	
	Результат = Новый Массив;

	ПрефиксПеременныхИПроцедур=Параметры.ПрефиксПеременныхИПроцедур;
	СтруктураПортативныхИнструментов=Параметры.СтруктураПортативныхИнструментов;
КонецПроцедуры // Открыть()

Функция Закрыть() Экспорт
	Возврат СтрСоединить(Результат);
КонецФункции // Закрыть()

Функция Подписки() Экспорт
	Перем Подписки;
	Подписки = Новый Массив;
	Подписки.Добавить("ПосетитьОбъявлениеМетода");
	Возврат Подписки;
КонецФункции // Подписки()

#Область РеализацияПодписок

Процедура ПосетитьОбъявлениеМетода(Описание) Экспорт
	Если НРег(Описание.Сигнатура.Имя) = "описаниемодулейинструментовдляподключения" Тогда
		
		ТекстПроцедуры = "
			|	//МЕТОД СГЕНЕРИРОВАН АВТОМАТИЧЕСКИ ПРИ СБОРКЕ ПОРТАТИВНОЙ ПОСТАВКИ ИНСТРУМЕНТОВ
			|
			|Описания=Новый Структура;
			|
			|";
		
		Для Каждого КлючЗначение ИЗ СтруктураПортативныхИнструментов.Инструменты Цикл
			ТекИнструмент=КлючЗначение.Значение;
			Если не ТекИнструмент.УспешноСобран Тогда
				Продолжить;
			КонецЕсли;
			
			ТекстПроцедуры = ТекстПроцедуры + "
				|ОписаниеИнструмента=НовыйОписаниеМодуля();
				|ОписаниеИнструмента.Имя=""" + ТекИнструмент.Имя + """;
				|ОписаниеИнструмента.Синоним=""" + СтрЗаменить(ТекИнструмент.Синоним,"""","""""") + """;
				|";
				
			Если ТекИнструмент.ЭтоОтчет Тогда
				ТекстПроцедуры=ТекстПроцедуры+"
				|ОписаниеИнструмента.Вид=""Отчет"";
				|";
			КонецЕсли;

			Если ТекИнструмент.НеДляВыводаВИнтерфейс Тогда
				ТекстПроцедуры=ТекстПроцедуры+"
				|ОписаниеИнструмента.НеВыводитьВИнтерфейс=Истина;
				|";
			КонецЕсли;

			ТекстПроцедуры=ТекстПроцедуры+"
			|Описания.Вставить(ОписаниеИнструмента.Имя,ОписаниеИнструмента);
			|";

		КонецЦикла;

		Для Каждого КлючЗначение Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
			ТекМодуль=КлючЗначение.Значение;
			ТекстПроцедуры = ТекстПроцедуры + "
				|ОписаниеИнструмента=НовыйОписаниеМодуля();
				|ОписаниеИнструмента.Имя=""" + ТекМодуль.Имя + """;
				|ОписаниеИнструмента.Тип=""ОбщийМодуль"";
				|Описания.Вставить(ОписаниеИнструмента.Имя,ОписаниеИнструмента);
				|";
		КонецЦикла;

		Для Каждого КлючЗначение Из СтруктураПортативныхИнструментов.Картинки Цикл
			ТекОбъект=КлючЗначение.Значение;
			ТекстПроцедуры = ТекстПроцедуры + "
				|ОписаниеИнструмента=НовыйОписаниеМодуля();
				|ОписаниеИнструмента.Имя=""" + ТекОбъект.Имя + """;
				|ОписаниеИнструмента.Тип=""ОбщаяКартинка"";
				|ОписаниеИнструмента.ИмяФайла=""" + ТекОбъект.Имя + ТекОбъект.РасширениеКартинки + """;
				|Описания.Вставить(ОписаниеИнструмента.Имя,ОписаниеИнструмента);
				|";
		КонецЦикла;
		
		ТекстПроцедуры = ТекстПроцедуры + "
			|
			|Возврат Описания;";
		
		
		Замена(ТекстПроцедуры, Описание.Операторы[0].Начало, Описание.Операторы[Описание.Операторы.Количество() - 1].Конец);
	ИначеЕсли НРег(Описание.Сигнатура.Имя) = "версия" Тогда
		СтрокаВставки = "Возврат """+СтруктураПортативныхИнструментов.Версия+""";"+Символы.ПС;
		Вставка(СтрокаВставки, Описание.Конец.Позиция);
	ИначеЕсли НРег(Описание.Сигнатура.Имя) = "поставщик" Тогда
		СтрокаВставки = "Возврат """+СтрЗаменить(СтруктураПортативныхИнструментов.Поставщик,"""","""""")+""";"+Символы.ПС;
		Вставка(СтрокаВставки, Описание.Конец.Позиция);
	
	КонецЕсли;

КонецПроцедуры

#КонецОбласти // РеализацияПодписок

Процедура Ошибка(Текст, Начало, Конец = Неопределено, ЕстьЗамена = Ложь)
	Ошибка = ТаблицаОшибок.Добавить();
	Ошибка.Источник = "ЗаменаВызоваПроцедурВызовСервера";
	Ошибка.Текст = Текст;
	Ошибка.ПозицияНачала = Начало.Позиция;
	Ошибка.НомерСтрокиНачала = Начало.НомерСтроки;
	Ошибка.НомерКолонкиНачала = Начало.НомерКолонки;
	Если Конец = Неопределено Или Конец = Начало Тогда
		Ошибка.ПозицияКонца = Начало.Позиция + Начало.Длина;
		Ошибка.НомерСтрокиКонца = Начало.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Начало.НомерКолонки + Начало.Длина;
	Иначе
		Ошибка.ПозицияКонца = Конец.Позиция + Конец.Длина;
		Ошибка.НомерСтрокиКонца = Конец.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Конец.НомерКолонки + Конец.Длина;
	КонецЕсли;
	Ошибка.ЕстьЗамена = ЕстьЗамена;
КонецПроцедуры

Процедура Замена(Текст, Начало, Конец = Неопределено)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ЗаменаВызоваПроцедурВызовСервера";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Начало.Позиция;
	Если Конец = Неопределено Тогда
		НоваяЗамена.Длина = Начало.Длина;
	Иначе
		НоваяЗамена.Длина = Конец.Позиция + Конец.Длина - Начало.Позиция;
	КонецЕсли;
КонецПроцедуры

Процедура Вставка(Текст, Позиция)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ЗаменаВызоваПроцедурВызовСервера";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Позиция;
	НоваяЗамена.Длина = 0;
КонецПроцедуры